home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turnbull China Bikeride
/
Turnbull China Bikeride - Disc 1.iso
/
DEMON
/
HAMRADIO
/
TERM93.ARC
/
Term93
/
!SerialDev
/
Modules
/
InternalBF
/
internalbf
(
.txt
)
< prev
Wrap
RISC OS BBC BASIC V Source
|
1995-10-14
|
16KB
|
526 lines
>InternalBF
-*| Alternative block driver specification
A*| Internal serial driver using David Pilling's buffer module
/*| Version 0.01 03-Jan-1995 Rainer Schubert
.*| Version 1.03 15-March-1993 Hugo Fiennes
code 8192
date$=
$,5,11):z$=
4:code!I%=0:
InsV=&14
RemV=&15
CnpV=&16
V=1<<28
C=1<<29
Z=1<<30
N=1<<31
driver_number = 0
#flag_morethanone = &00000001
#flag_splitrates = &00000002
#flag_hardwarefifo = &00000004
#flag_controlbreak = &00000008
#flag_requirespoll = &00000010
#flag_wontempty = &00000020
#flag_supportsblock = &00000040
!#flag_dontovio = &00000080
"#flag_supportsinquir = &00000100
pass=0
P%=code
[OPT pass
.entry
stmdb r13!,{r14}
), cmp r0,#((endoftable-table)/4)
* addcc pc,pc,r0,lsl#2
ldmia r13!,{pc}
.table
bal put_byte
bal get_byte
bal put_block
bal get_block
bal check_tx
bal check_rx
bal flush_tx
bal flush_rx
bal control_lines
7$ bal read_modem_control
8 bal read_rx_errors
bal send_break
bal examine_byte
bal tx_speed
bal rx_speed
bal wordformat
bal flowcontrol
bal initialise
bal closedown
A. ldmia r13!,{pc}^ ; Poll
.endoftable
check_and_set(&80)
.driverinfo
F5 equs "Risc PC internal port buffered"+z$
check_and_set(&A0)
.manufacturerinfo
J. equs "Rainer Schubert, DL6HBO"+z$
check_and_set(&C0)
.version
N+ equd &00000001 ; v0.01
.flags
P\ equd flag_splitrates + flag_supportsblock + flag_dontovio + flag_supportsinquir
.drivernumber
R" equd driver_number<<8
check_and_set(&100)
.speeds
equd 50
equd 75
equd 110
equd 134
equd 150
equd 300
equd 600
equd 1200
equd 1800
equd 2400
equd 3600
equd 4800
equd 7200
equd 9600
equd 19200
e#.speeds38400 equd 38400
equd 57600
equd 115200
equd 0
check_and_set(&180)
lM;--- Put byte routine ---------------------------------------------------
.put_byte
mov r0,#3
mov r1,r2
p swi "XOS_SerialOp"
movcc r0,#0
mvncs r0,#0
ldmia r13!,{pc}^
uM;--- Get byte routine ---------------------------------------------------
.get_byte
mov r0,#4
x swi "XOS_SerialOp"
movcc r0,r1
mvncs r0,#0
ldmia r13!,{pc}^
}M;--- Put block ----------------------------------------------------------
.put_block
swi "XOS_IntOff"
stmdb r13!,{r8,r9}
mov r8,r3
mov r9,#InsV
! mov r1,#(2
(1<<31))
# swi "XOS_CallAVector"
sub r0,r8,r3
ldmia r13!,{r8,r9}
swi "XOS_IntOn"
ldmia r13!,{pc}^
M;--- Get block ----------------------------------------------------------
.get_block
swi "XOS_IntOff"
stmdb r13!,{r8-r9}
movs r8,#0
mov r8,r3
mov r9,#RemV
! mov r1,#(1
(1<<31))
# swi "XOS_CallAVector"
sub r0,r8,r3
ldmia r13!,{r8-r9}
swi "XOS_IntOn"
ldmia r13!,{pc}^
M;--- Check TX buffer ----------------------------------------------------
.check_tx
swi "XOS_IntOff"
stmdb r13!,{r9}
teqp pc,#(2<<28)
mov r9,#CnpV
mov r1,#2
# swi "XOS_CallAVector"
mov r0,r1
orr r0,r0,r2,lsl#8
ldmia r13!,{r9}
swi "XOS_IntOn"
ldmia r13!,{pc}^
M;--- Check RX buffer ----------------------------------------------------
.check_rx
swi "XOS_IntOff"
stmdb r13!,{r9}
teqp pc,#0
mov r9,#CnpV
mov r1,#1
# swi "XOS_CallAVector"
mov r0,r1
orr r0,r0,r2,lsl#8
ldmia r13!,{r9}
swi "XOS_IntOn"
ldmia r13!,{pc}^
M;--- Flush TX buffer ----------------------------------------------------
.flush_tx
swi "XOS_IntOff"
stmdb r13!,{r9}
teqp pc,#V
mov r9,#CnpV
mov r1,#2
# swi "XOS_CallAVector"
ldmia r13!,{r9}
swi "XOS_IntOn"
ldmia r13!,{pc}^
M;--- Flush RX buffer ----------------------------------------------------
.flush_rx
swi "XOS_IntOff"
stmdb r13!,{r9}
teqp pc,#V
mov r9,#CnpV
mov r1,#1
# swi "XOS_CallAVector"
ldmia r13!,{r9}
swi "XOS_IntOn"
ldmia r13!,{pc}^
M;--- Control lines ------------------------------------------------------
.control_lines
stmdb r13!,{r2}
cmp r2,#0
$ blt control_lines_read
tst r2,#1
, moveq r1,#(1<<3) ; DTR
movne r1,#0
mvn r2,#(1<<3)
mov r0,#0
swi "XOS_SerialOp"
ldr r2,[r13,#0]
, tst r2,#2 ; RTS
movne r1,#2
moveq r1,#0
str r1,last_rts
mov r0,#2
swi "XOS_Byte"
.control_lines_read
mov r0,#0
mov r1,#0
mvn r2,#0
swi "XOS_SerialOp"
tst r1,#(1<<3)
moveq r3,#1
movne r3,#0
ldr r1,last_rts
cmp r1,#0
orrne r3,r3,#2
mov r0,r3
ldmia r13!,{r2}
ldmia r13!,{pc}^
.last_rts
equd 0
M;--- Read modem control lines -------------------------------------------
.read_modem_control
mov r0,#0
mov r1,#0
mvn r2,#0
swi "XOS_SerialOp"
mov r0,#0
orr r0,r0,#2
, tst r1,#(1<<18) ; DCD
orreq r0,r0,#1
5 tst r1,#(1<<19) ; DSR (ie CTS)
orrne r0,r0,#(1<<3)
ldmia r13!,{pc}^
M;--- Read RX errors -----------------------------------------------------
.read_rx_errors
mov r0,#0
ldmia r13!,{pc}^
M;--- Send break ---------------------------------------------------------
.send_break
mov r0,#2
mov r1,r2
swi "XOS_SerialOp"
ldmia r13!,{pc}^
M;--- Examine byte -------------------------------------------------------
.examine_byte
mov r0,#&98
mov r1,#1
swi "OS_Byte"
mvncs r0,#0
movcc r0,r2
ldmia r13!,{pc}^
M;--- Set speed ----------------------------------------------------------
.tx_speed_mask
equd &03010FE0
.tx_speed
cmp r2,#0
blt tx_speed_read
adr r3,speed_table
.tx_speed_loop
ldr r1,[r3],#8
cmp r1,#0
beq tx_speed_read
cmp r1,r2
% beq tx_speed_found
bal tx_speed_loop
.tx_speed_found
)" str r2,tx_speed_last
* ldr r0,sevenfourty
ldr r1,[r3,#-4]
cmp r0,#0
-! beq tx_speed_normal
cmp r0,#1
beq tx_speed_one
cmp r0,#2
beq tx_speed_two
2! bal tx_speed_normal
.tx_speed_two
tst r1,#&FF
5! bne tx_speed_normal
mov r1,r1,lsr #16
rsb r1,r1,#&13
8! bal tx_speed_normal
.tx_speed_one
swi "XOS_EnterOS"
;" ldr r0,tx_speed_mask
ldrb r2,[r0,#12]
orr r2,r2,#&80
strb r2,[r0,#12]
mov r2,#6
strb r2,[r0,#0]
mov r2,#0
strb r2,[r0,#4]
ldrb r2,[r0,#12]
bic r2,r2,#&80
strb r2,[r0,#12]
F+ teqp pc,#0 ; exit os
G' mov r0,r0 ; NOP
stmdb r13!,{r1}
mov r0,#6
mov r1,#8
K swi "XOS_SerialOp"
ldmia r13!,{r1}
tst r1,#&FF
N! bne tx_speed_normal
swi "XOS_EnterOS"
P" ldr r0,tx_speed_mask
ldrb r2,[r0,#12]
orr r2,r2,#&80
strb r2,[r0,#12]
mov r1,r1,lsr #16
strb r1,[r0,#0]
mov r1,r1,lsr #8
strb r1,[r0,#4]
ldrb r2,[r0,#12]
bic r2,r2,#&80
strb r2,[r0,#12]
[+ teqp pc,#0 ; exit os
\' mov r0,r0 ; NOP
bal tx_speed_read
.tx_speed_normal
mov r0,#6
` swi "XOS_SerialOp"
.tx_speed_read
b" ldr r0,tx_speed_last
ldmia r13!,{pc}^
.rx_speed
cmp r2,#0
blt rx_speed_read
i adr r3,speed_table
.rx_speed_loop
ldr r1,[r3],#8
cmp r1,#0
beq rx_speed_read
cmp r1,r2
o beq rx_speed_found
bal rx_speed_loop
.rx_speed_found
s" str r2,rx_speed_last
u ldr r0,sevenfourty
ldr r1,[r3,#-4]
cmp r0,#0
x! beq rx_speed_normal
cmp r0,#1
beq rx_speed_one
cmp r0,#2
beq rx_speed_two
bal rx_speed_read
.rx_speed_two
tst r1,#&FF
! bne rx_speed_normal
mov r1,r1,lsr #16
rsb r1,r1,#&13
! bal rx_speed_normal
.rx_speed_one
swi "XOS_EnterOS"
" ldr r0,tx_speed_mask
ldrb r2,[r0,#12]
orr r2,r2,#&80
strb r2,[r0,#12]
mov r2,#6
strb r2,[r0,#0]
mov r2,#0
strb r2,[r0,#4]
ldrb r2,[r0,#12]
bic r2,r2,#&80
strb r2,[r0,#12]
+ teqp pc,#0 ; exit os
' mov r0,r0 ; NOP
stmdb r13!,{r1}
mov r0,#6
mov r1,#8
swi "XOS_SerialOp"
ldmia r13!,{r1}
tst r1,#&FF
! bne rx_speed_normal
swi "XOS_EnterOS"
" ldr r0,tx_speed_mask
ldrb r2,[r0,#12]
orr r2,r2,#&80
strb r2,[r0,#12]
mov r1,r1,lsr #16
strb r1,[r0,#0]
mov r1,r1,lsr #8
strb r1,[r0,#4]
ldrb r2,[r0,#12]
bic r2,r2,#&80
strb r2,[r0,#12]
+ teqp pc,#0 ; exit os
' mov r0,r0 ; NOP
bal rx_speed_read
.rx_speed_normal
mov r0,#5
swi "XOS_SerialOp"
.rx_speed_read
" ldr r0,rx_speed_last
ldmia r13!,{pc}^
.speed_table
equd 50:equd 9
equd 75:equd 1
equd 110:equd 10
equd 134:equd 11
equd 150:equd 2
equd 300:equd 3
equd 600:equd 12
equd 1200:equd 4
equd 1800:equd 13
equd 2400:equd 5
equd 3600:equd 14
equd 4800:equd 6
equd 7200:equd 15
equd 9600:equd 7
equd 19200:equd 8
;.sp38400 equd 38400: .sp38400data equd &30000
$ equd 57600:equd &20000
$ equd 115200:equd &10000
equd 0:equd 0
.tx_speed_last
equd 115200
.rx_speed_last
equd 115200
M;--- Set word format ----------------------------------------------------
.wordformat
cmp r2,#0
! blt wordformat_read
mov r0,#1
mov r1,r2
$ str r1,wordformat_last
swi "XOS_SerialOp"
.wordformat_read
$ ldr r0,wordformat_last
ldmia r13!,{pc}^
.wordformat_last
equd 0
M;--- Set flow control ---------------------------------------------------
.flowcontrol
stmdb r13!,{r2}
mov r0,#203
mov r1,#100
mov r2,#0
swi "XOS_Byte"
mov r0,#0
mov r1,#0
% ldr r2,flowcontrol_mask
swi "XOS_SerialOp"
mov r0,#0
mov r1,#1
% ldr r2,flowcontrol_mask
swi "XOS_SerialOp"
mov r0,#0
mov r1,#0
% ldr r2,flowcontrol_mask
swi "XOS_SerialOp"
ldmia r13!,{r3}
cmp r3,#0
& ldrlt r0,flowcontrol_dunno
ldmltia r13!,{pc}^
4 moveq r1,#4 ; No flow, ignore DSR
cmp r3,#1
1 moveq r1,#0 ; Hardware control
cmp r3,#2
5 moveq r1,#5 ; Xon/xoff, ignore DSR
cmp r3,#3
% moveq r1,#1 ; Both
mov r0,#0
mvn r2,#5
swi "XOS_SerialOp"
& ldr r0,flowcontrol_dunno
& str r3,flowcontrol_dunno
ldmia r13!,{pc}^
.flowcontrol_mask
equd &fffdfffe
.flowcontrol_last
equd &fffdffee
.flowcontrol_dunno
< equd 0 ; don't know what this is for (&6CC)
D ; used as a replacement for flowcontrol_last
M;--- Initialise driver --------------------------------------------------
.initialise
stmdb r13!,{r1-r8}
mov r8,r1
mov r0,#2
" swi "OS_ReadSysInfo"
bvs init_two
cmp r1,#0
beq init_two
mov r0,#3
" swi "OS_ReadSysInfo"
tst r1,#&F000
moveq r0,#1
movne r0,#2
str r0,sevenfourty
bal init_three
.init_two
mov r0,#0
#C str r0,sp38400 ; end speedtable for old hardware
$ str r0,sp38400data
%9 str r0,speeds38400 ; dito for speeds table
& str r0,sevenfourty
.init_three
cmn r8,#1
beq init_four
mov r2,#3
adr r14,init_four
stmdb r13!,{r14}
bl control_lines
.init_four
movs r0,#0
ldmia r13!,{r1-r8}
ldmia r13!,{pc}^
2M;--- An unknown label ---------------------------------------------------
.sevenfourty
4< equd 0 ; don't know what this is for (&740)
6M;--- Close down driver --------------------------------------------------
.closedown
ldmia r13!,{pc}^
"OS_File",10,"SerialDev:Modules.InternalBF.Driver",&FFD,,code,P%
SYS"OS_File",10,"^.!SerialDev.Modules.InternalBF.Driver",&FFD,,code,P%
check_and_set(A%):
(P%-code)>A%
1,"Block &"+
~A%+" exceeded"::=0
P%=code+A%:=0